<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
	<head>
		<title>Структура и параметры метаданных</title>
		<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
		<style type="text/css"> 
			body {
				background-color: #ffffff;
				color: #000;
				font-family: Verdana, Arial, sans-serif;
				font-size: 12px;
			}
			
			pre {
				background-color: #eeeeee
			}
		</style> 
	</head>
	<body>
		<h1>Структура и параметры метаданных</h1>

		<p>Метаданные проекта хранятся в файле /include/metadata.php и представляют собой отдельный класс с двумя статическими переменными: массивами $tables и $tools. Ключи хэшей массива $tables являются названиями таблиц в БД. Ключи хэшей "fields" являются названиями полей таблиц в БД. Ниже приведен пример метаданных, описывающих таблицу "test_table" с полями всех возможных типов и утилиту "test_tool":</p>

		<pre>
&lt;?php
	class metadata
	{
		public static $objects = array(
			'test_table' =&gt; array(
				'title' =&gt; 'Тестовая таблица',
				'class' =&gt; 'tableclass',
				'no_add' =&gt; true,
				'fields' =&gt; array(
					'test_id' =&gt; array( 'title' =&gt; 'Идентификатор', 'type' =&gt; 'pk' ),
					'test_parent' =&gt; array( 'title' =&gt; 'Родительская запись', 'type' =&gt; 'parent' ),
					'test_title' =&gt; array( 'title' =&gt; 'Строка', 'type' =&gt; 'string', 'main' =&gt; 1, 'errors' =&gt; 'require' ),
					'test_description' =&gt; array( 'title' =&gt; 'Текст', 'type' =&gt; 'text', 'translate' =&gt; 1 ),
					'test_password' =&gt; array( 'title' =&gt; 'Пароль', 'type' =&gt; 'password' ),
					'test_date' =&gt; array( 'title' =&gt; 'Дата', 'type' =&gt; 'date', 'show' =&gt; 1, 'sort' =&gt; 'desc' ),
					'test_datetime' =&gt; array( 'title' =&gt; 'Дата/время', 'type' =&gt; 'datetime' ),
					'test_count' =&gt; array( 'title' =&gt; 'Число', 'type' =&gt; 'int', 'no_add' =&gt; 1 ),
					'test_price' =&gt; array( 'title' =&gt; 'Цена', 'type' =&gt; 'float', 'no_edit' =&gt; 1 ),
					'test_checked' =&gt; array( 'title' =&gt; 'Флаг', 'type' =&gt; 'boolean' ),
					'test_select' =&gt; array( 'title' =&gt; 'Список', 'type' =&gt; 'select', 'filter' =&gt; 1, 'values' =&gt; array(
						array( 'value' =&gt; '1', 'title' =&gt; 'Вариант 1' ),
						array( 'value' =&gt; '2', 'title' =&gt; 'Вариант 2' ) ), 'errors' =&gt; 'require|int' ),
					'test_table' =&gt; array( 'title' =&gt; 'Таблица', 'type' =&gt; 'table', 'table' =&gt; 'table_name', 'filter' =&gt; 1 ),
					'test_file' =&gt; array( 'title' =&gt; 'Файл', 'type' =&gt; 'file', 'upload_dir' =&gt; 'files' ),
					'test_image' =&gt; array( 'title' =&gt; 'Изображение', 'type' =&gt; 'image', 'upload_dir' =&gt; 'images' ),
					'test_default' =&gt; array( 'title' =&gt; 'По умолчанию', 'type' =&gt; 'default', 'show' =&gt; 1 ),
					'test_order' =&gt; array( 'title' =&gt; 'Порядок', 'type' =&gt; 'order', 'group' =&gt; array( 'test_select' ) ),
					'test_active' =&gt; array( 'title' =&gt; 'Активность', 'type' =&gt; 'active' ),
				),
				'links' =&gt; array(
					'work' =&gt; array( 'table' =&gt; 'work', 'field' =&gt; 'work_user', 'title' =&gt; 'Работы' ),
					'series' =&gt; array( 'table' =&gt; 'series', 'field' =&gt; 'series_user', 'hidden' =&gt; 1 ),
					'person' =&gt; array( 'table' =&gt; 'person', 'field' =&gt; 'person_user', 'hidden' =&gt; 1, 'ondelete' =&gt; 'ignore' ),
				),
				'relations' =&gt; array(
					'roles' =&gt; array( 'secondary_table' =&gt; 'roles', 'relation_table' =&gt; 'user_has_roles',
						'primary_field' =&gt; 'test_id', 'secondary_field' =&gt; 'role_id' ),
				),
			),
			
			'test_tool' =&gt; array(
				'title' =&gt; 'Тестовая утилита',
				'class' =&gt; 'toolclass'
			),
		);
	}
?&gt;
		</pre>

		<h2 id="Параметры-таблиц">Параметры таблиц</h2>

		<p><b>title</b>* (строка) - Отображаемое название таблицы.<br>
		<b>fields</b>* (массив) - Список полей таблицы.</p>

		<p><b>class</b> (строка) - Название класса, реализующего особенности обработки таблицы. Класс должен быть описан в файле с таким же названием (с прибавлением расширения .php) и находится в каталоге /admin/include/class. Класс должен наследоваться от класса table.</p>

		<p><b>no_add</b> (true/false) - Запрет на добавление записей. Ограничение распространяется также на операцию копирования.<br>
		<b>no_edit</b> (true/false) - Запрет на изменение записей.<br>
		<b>no_delete</b> (true/false) Запрет на удаление записей.</p>

		<p><b>internal</b> (true/false) - Таблица является внутренней и не отображается в административном интерфейсе. Такие таблицы нужны для организации хранения специальных данных, например, связей "многие ко многим". Таблицы не используются самостоятельно, а только через специальные интерфейсы других таблиц.</p>

		<p><b>links</b> (массив) - Список связей таблиц "один ко многим" <br>
		<b>relations</b> (массив) - Список связей таблиц "многие ко многим"</p>

		<p>Параметры, помеченные * являются обязательными.</p>

		<h2 id="Параметры-полей">Параметры полей</h2>

		<p><b>title</b>* (строка) - Отображаемое название поля<br>
		<b>type</b>* (строка) - Тип поля</p>

		<p><b>main</b> (1/0) - "Главное" поле. Всегда отображается в списке записей, имеет ширину 100%. Также это поле используется как заголовок для выпадающих списков с записями этой таблицы. Хотя бы одно поле в таблице должно быть объявлено главным (за исключением внутренних таблиц).<br>
		<b>show</b> (1/0) - Поле выводится в списке записей.<br>
		<b>sort</b> ('asc'/'desc') - Сортировка списка записей по умолчанию будет производиться по этому полю.<br>
		<b>filter</b> (1/0) - Вывод специального фильтра по данному полю. Параметр применим для полей типа select, table, string, text, boolean и active.<br>
		<b>no_filter</b> (1/0) - Запрет вывода фильтра по умолчанию по данному полю.<br>
		<b>search</b> (строка) - Тип фильтра. Для полей типа table при значение этого параметра "text" поиск ведется по главному полю в связанной таблице.<br>
		<b>translate</b> (1/0) - Переводимое поле. В списке записей выводится его версия на языке по умолчанию. Параметр применим для полей типа string и text.<br>
		<b>editor</b> (1/0) - Использовать для редактирования WYSIWYG-редактор.<br>
		<b>default</b> (строка) - Значение по умолчанию. Подставляется в форму при добавлении записи.</p>

		<p><b>errors</b> (строка) - Ограничения, накладываемые на значение данного поля. Список строк с разделителем "|".<br>
		<b>no_add</b> (1/0) - Запрет на добавление поля. Ограничение распространяется также на операцию копирования.<br>
		<b>no_edit</b> (1/0) - Запрет на изменение поля при редактировании записи.</p>

		<p><b>group</b> (массив) - Группировка записей. Группы записей определяются уникальной комбинацией значений полей, перечисленных в значении параметра. Значение параметра является перечислением системных названий полей, которые участвуют в определении группы. Если значение параметра - пустой массив, то группой являются все записи таблицы.<br>
		<b>values</b> (массив) - Перечень возможных ключей и значения поля типа select. Массив имеет следующий формат: array( array( 'value' =&gt; '1', 'title' =&gt; 'Вариант 1' ), array( 'value' =&gt; '2', 'title' =&gt; 'Вариант 2' ), ).<br>
		<b>table</b> (строка) - Название таблицы для поля типа table.</p>

		<p><b>upload_dir</b> (строка) - Каталог для закачки файлов для полей типа image и file.</p>

		<h2 id="Типы-полей">Типы полей</h2>

		<p><b>pk</b> - Ключевое поле, уникальный идентификатор записи. Обязательное для отображаемых таблиц<br>
		<b>parent</b> - Поле, содержащее идентификатор родительской записи для иерархических таблиц<br>
		<b>string</b> - Строковое поле<br>
		<b>text</b> - Текстовое поле<br>
		<b>password</b> - Поле для ввода пароля<br>
		<b>date</b> - Поле для ввода даты в формате DD.MM.YYYY<br>
		<b>datetime</b> - Поле для ввода даты и времени в формате DD.MM.YYYY HH:MM<br>
		<b>int</b> - Поле для ввода целого числа<br>
		<b>float</b> - Поле для ввода числа с плавающей точкой<br>
		<b>boolean</b> - Поле для хранения логического переменной<br>
		<b>select</b> - Списковое поле с фиксированным списком значений<br>
		<b>table</b> - Списковое поле, список значений которого берется из таблицы<br>
		<b>file</b> - Поле для хранения ссылки на файл с возможностью закачки<br>
		<b>image</b> - Поле для хранения ссылки на изображения с возможностью закачки<br>
		<b>default</b> - Поле для хранения значения по умолчанию. Как правило используется с параметром group.<br>
		<b>order</b> - Порядковое поле. Как правило используется с параметром group.<br>
		<b>active</b> - Поле для хранения факта видимости записи.</p>

		<h2 id="Ограничения-полей">Ограничения полей</h2>

		<p><b>require</b> - обязательное поле<br>
		<b>int</b> - целочисленное поле<br>
		<b>float</b> - поле с плавающей точкой<br>
		<b>date</b> - поле даты<br>
		<b>datetime</b> - поле даты/времени<br>
		<b>email</b> - поле email<br>
		<b>alpha</b> - буквы и цифры</p>

		<h2 id="Параметры-связей-один-к-одному">Параметры связей "один ко одному"</h2>

		<p><b>table</b>* (строка) - Название зависимой таблицы<br>
		<b>field</b>* (строка) - Название поля связи в зависимой таблице</p>

		<p><b>title</b> (строка) - Название связи. По умолчанию берется название зависимой таблицы.<br>
		
		<h2 id="Параметры-связей-один-ко-многим">Параметры связей "один ко многим"</h2>

		<p><b>table</b>* (строка) - Название зависимой таблицы<br>
		<b>field</b>* (строка) - Название поля связи в зависимой таблице</p>

		<p><b>title</b> (строка) - Название связи. По умолчанию берется название зависимой таблицы.<br>
		<b>hidden</b> (1/0) - Скрытая связь. Ссылка на зависимую таблицу не отображается в списке записей.</p>

		<p><b>ondelete</b> (строка) - Действия при удаление записи. Возможные значения: "cascade" - каскадное удаление записей зависимой таблицы (действует только на один уровень), "set_null" - установка поля в null, "ignore" - ничего не делать.</p>

		<h2 id="Параметры-связей-многие-ко-многим">Параметры связей "многие ко многим"</h2>

		<p><b>secondary_table</b>* (строка) - Название вторичной таблицы</p>

		<p><b>relation_table</b>* (строка) - Название таблицы связи<br>
		<b>primary_field</b>* (строка) - Название поля-идентификатора записей из основной таблицы в таблице связи<br>
		<b>secondary_field</b>* (строка) - Название поля-идентификатора записей из вторичной таблицы в таблице связи</p>

		<h2 id="Параметры-утилит">Параметры утилит</h2>

		<p><b>title</b>* (строка) - Отображаемое название утилиты.</p>

		<p><b>class</b>* (строка) - Название класса, реализующего функционал утилиты. Класс должен быть описан в файле с таким же названием (с прибавлением расширения .php) и находится в каталоге /admin/include/class. Класс должен наследоваться от класса tool.</p>
	</body>
</html>